home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / optivc32 / vdemow2.cpp < prev    next >
C/C++ Source or Header  |  1999-03-06  |  11KB  |  261 lines

  1. /*****************************   VDEMOW2.CPP *****************************
  2. *                                                                        *
  3. *                Demo program for                                        *
  4. *               V e c t o r L i b                                        *
  5. *           for Borland C++ for Windows                                  *
  6. *     with OWL 2.0 or 5.0 (shipped with Borland C++ versions 4.x, 5.x)   *
  7. *                                                                        *
  8. *       Copyright 1996-1999 by Martin Sander                             *
  9. *                                                                        *
  10. *                                                                        *
  11. *       This sample program is meant to demonstrate how to use           *
  12. *       VectorLib within your Windows programs. It is not intended       *
  13. *       to demonstrate best Windows programming.                         *
  14. *                                                                        *
  15. **************************************************************************/
  16. /*
  17.     1. Open the new-project menu with  Project/New.
  18.     2. Call the project VDEMOW2.
  19.     3.a) 32-bit: Choose Application[EXE] for Win32 GUI, static linking,
  20.                  single-thread.
  21.     3.b) 16-bit: Choose Application[EXE] for Windows3.x, memory model LARGE.
  22.     4. Be sure, CheckBox for the inclusion of OWL is checked.
  23.     5. Hit OK.
  24.     6. In the Project window that will now be on the screen, delete the
  25.        nodes VDEMOW2.DEF and VDEMOW2.RC.
  26.     7.a) 32-bit: Add the node VCF3W.LIB.
  27.     7.b) 16-bit: Add the node VCL3W.LIB.
  28.     8. In Options/Project, be sure the include-file search path and the
  29.        library search path both include the respective  OPTIVEC directories,
  30.        e.g.: \bc\optivec\include and bc\optivec\lib, resprectively
  31.     9. Compile and run.
  32. */
  33.  
  34. #include <owl\owlpch.h>
  35. #include <owl\applicat.h>
  36. #include <owl\framewin.h>
  37.  
  38. #include <VFstd.h>
  39. #include <VCFstd.h>
  40. #include <VFmath.h>
  41. #include <VCFmath.h>
  42. #include <VIstd.h>
  43. #include <Vgraph.h>
  44. #include <math.h>
  45. #if __BORLANDC__ < 0x500
  46.     #define BCBOOL BOOL
  47. #else
  48.     #define BCBOOL bool
  49. #endif
  50. NEWMATHERR
  51.  
  52. class TVecWindow : public TWindow
  53. {
  54.   public:
  55.      fVector  X1, X2, Y1, Y2, Y3, Y4, Spc, Freq, Win;
  56.      cfVector CX1, CX2;
  57.      iVector  I1;
  58.      ui       vsize, spcsize;
  59.      int      vview;
  60.      struct   time tStart, tStop;
  61.      TVecWindow(TWindow *parent = 0);
  62.     ~TVecWindow()
  63.        { V_nfree( 12, I1, X1, X2, Y1, Y2, Y3, Y4, CX1, CX2, Spc, Freq, Win );  }
  64.      void   StartTime( void );
  65.      double StopTime( void );
  66.      void EvRButtonDown(UINT, TPoint&);
  67.      void Paint(TDC&, BCBOOL, TRect&);
  68.      DECLARE_RESPONSE_TABLE(TVecWindow);
  69. };
  70.  
  71. DEFINE_RESPONSE_TABLE1(TVecWindow, TWindow)
  72.   EV_WM_RBUTTONDOWN,
  73. END_RESPONSE_TABLE;
  74.  
  75. TVecWindow::TVecWindow(TWindow *parent)
  76. {
  77.   Init(parent, 0, 0);
  78.   vsize  = 1025;
  79.   spcsize = 128;
  80.   vview  =    0;
  81.   V_setErrorEventFile( "VDEMO.LOG", 1 ); // save all VectorLib error messages
  82.   I1 = VI_vector( vsize );
  83.   X1 = VF_vector( vsize );
  84.   X2 = VF_vector( vsize );
  85.   Y1 = VF_vector( vsize );
  86.   Y2 = VF_vector( vsize );
  87.   Y3 = VF_vector( vsize );
  88.   Y4 = VF_vector( vsize );
  89.   Spc= VF_vector( spcsize+1 );
  90.   Freq=VF_vector( spcsize+1 );
  91.   Win= VF_vector( 2*spcsize );
  92.   CX1 = VCF_vector( vsize );
  93.   CX2 = VCF_vector( vsize );
  94. }
  95.  
  96.  
  97. void TVecWindow::EvRButtonDown(UINT, TPoint&)
  98. {
  99.   switch( vview )
  100.   {
  101.      default: vview=-1;
  102.      case 0:  VF_ramp( X1, vsize, 0, 80*M_PI/vsize );
  103.               VF_ramp( Freq, spcsize+1, 0, (vsize / (80*M_PI)) / spcsize );
  104.                 /* get a time axis from 0 to 80 Pi and a corresponding
  105.                    frequency axis from 0 to the Nyquist frequency */
  106.               VF_sin( Y1, X1, vsize );
  107.                     //  get a simple sine wave
  108.               break;
  109.      case 1:  VF_cmp_gtC( Y2, Y1, vsize, 0.7 );
  110.                     //  transform the sine into an asymmetric square wave
  111.               break;
  112.      case 2:  VF_Hanning( Win, 2*spcsize );
  113.               Spc[spcsize] = VFs_spectrum( Spc, spcsize, Y2, vsize, Win );
  114.                     //  analyse the frequency spectrum of the square wave
  115.               break;
  116.      case 3:  VI_ramp( I1, vsize, 0, 1 );
  117.               VF_ramp( X1, vsize, 0, 4.0 /(vsize-1) );
  118.               VF_sinrpi2( Y1, I1, vsize, (vsize-1)/2);
  119.               VFx_equV( Y1, Y1, vsize, 10.0, 20.0 );
  120.                    // get a sine wave, magnify it by a factor of 10
  121.                    // and displace it vertically by +20 units.
  122.               VF_tanrpi2( Y2, I1, vsize, (vsize-1)/2);
  123.               VF_limit( Y2, Y2, vsize, -40, 40 );
  124.                    //  limit the range of tangent values
  125.               VF_cosecrpi2( Y3, I1, vsize, (vsize-1)/2);
  126.               VF_limit( Y3, Y3, vsize, -40, 40 );
  127.                     //  the same for cosecant values
  128.               VF_subC( Y3, Y3, vsize, 20.0 );
  129.                     //  displace the cosecant by -20 units.
  130.               break;
  131.      case 4:  VCF_ramp( CX1, vsize, fcplx( M_PI, 0),
  132.                                     fcplx(0.4, 0.008) );
  133.               VCF_cos( CX2, CX1, vsize );
  134.               VCF_sin( CX1, CX1, vsize );
  135.                     //  Try also with other complex functions!
  136.               break;
  137.      case 5:  break;
  138.   }
  139.   vview++;
  140.   Invalidate();
  141. }
  142.  
  143. void TVecWindow::Paint(TDC& DC, BCBOOL, TRect&)
  144. {
  145.    char      dum[100];
  146.    unsigned  i, j;
  147.    float     xt, A=1.2, B=-0.13, C=0.85;
  148.  
  149.    V_initPlot( HWindow, DC );  // HWindow is the handle to the current Window
  150.    switch( vview )
  151.    {
  152.        default: break;
  153.        case 0: TextOut( DC, 10, 10,
  154.                "This is a series of graphs illustrating VectorLib functions.", 60 );
  155.                TextOut( DC, 10, 40,
  156.                "Always press the right mouse button to see the next view!", 56 );
  157.                TextOut( DC, 10, 70,
  158.                "Press [Alt] [F4] to end the demonstration.", 41 );
  159.                break;
  160.        case 1: TextOut( DC, 0, 10, "Sine wave", 9 );
  161.                V_drawAxes( VF_min( X1, vsize/2 ), VF_max( X1, vsize/2 ),
  162.                            -1.0, +1.0 );
  163.                VF_xyDataPlot( X1, Y1, vsize/2, PS_SOLID, LIGHTRED );
  164.                           // show only half of all waves
  165.                break;
  166.        case 2: TextOut( DC, 0, 10, "Asymmetric", 10 );
  167.                TextOut( DC, 0, 30, "square wave", 11 );
  168.                V_drawAxes( 0, vsize, -0.3, 1.2 );
  169.                VF_yDataPlot( Y2, vsize, PS_SOLID, BLUE );
  170.                break;
  171.        case 3: TextOut( DC, 0,  10, "Frequency spectrum", 18 );
  172.                TextOut( DC, 0,  30, "of the square wave", 18 );
  173.                TextOut( DC, 0, 150, "Don't be sur-", 13 );
  174.                TextOut( DC, 0, 170, "prised; the next", 16 );
  175.                TextOut( DC, 0, 190, "example will show", 17 );
  176.                TextOut( DC, 0, 210, "a bit of error", 14 );
  177.                TextOut( DC, 0, 230, "handling!", 9 );
  178.                VF_xyAutoPlot( Freq, Spc, spcsize+1, PS_SOLID | SY_CROSS, GREEN );
  179.                break;
  180.        case 4: TextOut( DC, 0,  10, "Trigonometric", 13 );
  181.                TextOut( DC,10,  30, "functions:", 10 );
  182.                TextOut( DC, 0,  50, "Red:   sine", 11 );
  183.                TextOut( DC, 0,  70, "Green: tangent", 14 );
  184.                TextOut( DC, 0,  90, "Blue:  cosecant", 15 );
  185.                TextOut( DC, 0, 120, "(sine:", 6 );
  186.                TextOut( DC, 0, 140, "   *10 and +20,", 15 );
  187.                TextOut( DC, 0, 160, " cosecant: -20)", 15 );
  188.                VF_xy2AutoPlot( X1, Y2, vsize, PS_SOLID, LIGHTGREEN,
  189.                                X1, Y3, vsize, PS_SOLID, LIGHTBLUE );
  190.                VF_xyDataPlot( X1, Y1, vsize, PS_SOLID, LIGHTRED );
  191.                break;
  192.        case 5: TextOut( DC, 0,  10, "Playing with functions", 22 );
  193.                TextOut( DC, 0,  30, "in the complex plane:", 21 );
  194.                TextOut( DC, 0,  60, "Red:   complex sine",  19 );
  195.                TextOut( DC, 0,  80, "Green: complex cos